package kt

// 闭包
// 参数闭包

fun main() {
//    var funDemo = closeTestFun()
//    funDemo()
//    funDemo()
//    funDemo()

//    var sumDemo = sumTest()
//
//    println(sumDemo(10))
//    println(sumDemo(10))
//    println(sumDemo(10))


    var test = ParemsIsClosureDemo()

//    var result2 = test.paremsIsClosure(1 , {a -> a +1})
    // 等价
    var result1 = test.paremsIsClosure(1) { a -> a + 1 }

    print(result1())

}

// 这里的不进行返回，所以 使用 Unit
fun closeTestFun() : () -> Unit{
    var a = 3

    return fun (){
        a ++
        println(a)
    }

}


// (Int)->Int   代表  传递一个int类型的参数，返回一个int值
fun sumTest():(Int)->Int{
    var total = 0

    return {
        total = total + it
        total
    }

}



// 调用方法
//var test = ParemsIsClosureDemo()
//    var result2 = test.paremsIsClosure(1 , {a -> a +1})
// 等价
//var result1 = test.paremsIsClosure(1) { a -> a + 1 }



class ParemsIsClosureDemo{

    /***
     * 参数b ，是一个闭包类型的函数，{a -> a + 1}
     */
    fun paremsIsClosure(a : Int , b : (Int) -> Int):() -> Int{
        return fun():Int{
            return a + b(a)
        }
    }


    // paremsIsClosure 和 paremsIsClosure2 两者等价
    fun paremsIsClosure2(a : Int , b : (Int)-> Int):()->Int{
        return {
            a + b(a)
        }
    }

}







